// random
// Created by Administrator on 2025/6/27.
// 随机数的应用


#include <iomanip>
#include <iostream>
#include <random>
using namespace std;


/**
 * random 由三个主要组件组成：
 * 1、随机数引擎：生成随机数的核心，用于控制过程中的可重复性和随机性
 * 2、随机数分散：控制生成的数值遵循的概率分布类型
 * 3、随机数适配器：适配随机数引擎，将随机数引擎适配为生成随机数的对象
 *
 */
void baseFunc() {
    // 使用随机数引擎创建一个随机种子
    random_device rd;
    // 使用随机数种子初始化随机数生成器
    mt19937 gen(rd());
    // 打印一个随机数
    cout << "random number:" << gen() << "\n" << endl;

    // 创建一个均匀分布的随机数生成器，范围从 0 至 10
    uniform_int_distribution<int> distribution(1, 10);
    cout << "distribution random number:\t";
    for (int i = 0; i < 5; i++) {
        cout << distribution(gen) << "\t";
    }
    cout << endl;

    // 创建一个正态分布的随机数生成器，均值为 0.0，标准差为 1.0
    normal_distribution<double> doubleDistribution(0.0, 1.0);
    // 设置输出格式，保留两位小数
    cout << fixed << setprecision(2);
    cout << "doubleDistribution random number:\t";
    for (int i = 0; i < 5; i++) {
        cout << doubleDistribution(gen) << "\t";
    }
    cout << endl;
}

/**
 * discard_block_engine ：丢弃指定间隔的随机数，提高随机性
 *
 */
void discardBlockEngineFunc2() {
    random_device rd;
    mt19937 gen(rd());
    // 丢弃一定的随机数，仅保留指定间隔的随机数
    // 50 个块，每次调用时跳过 5 个
    discard_block_engine<mt19937, 50, 5> discard_block_engine(gen);
    cout << "Discard block random number:" << discard_block_engine() << endl;
}

/**
 * independent_bits_engine ：创建指定长度bit的随机数
 *
 */
void independentBitsEngineFunc() {
    random_device rd;
    mt19937 gen(rd());
    // 创建一个独立位引擎，用于生成 32 位bit的随机数
    independent_bits_engine<mt19937, 32, uint32_t> independent_bits_engine(gen());
    cout << "independent_bits_engine random number:" << independent_bits_engine() << endl;
}


int main(int argc, char *argv[]) {
    // baseFunc();
    // discardBlockEngineFunc2();
    independentBitsEngineFunc();
}
